package com.yao.seckill.web.schedule;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.yao.seckill.web.enums.RabbitmqEnum;
import com.yao.seckill.web.pojo.RabbitConfirmMsg;
import com.yao.seckill.web.service.IRabbitConfirmMsgService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Copyright (C), 2022-2022, 姚兵
 * Author: 32210
 * Date: 2022/9/16 17:00
 * FileName: DemoQueueSchedule
 * Description: 123
 */
@Component
@Slf4j
public class DemoQueueSchedule {

    @Autowired
    private IRabbitConfirmMsgService rabbitConfirmMsgService;
    //每五秒执行一次
//   # Cron表达式范例：
//    每隔5秒执行一次：*/5 * * * * ?
//    每隔1分钟执行一次：0 */1 * * * ?
//    每天23点执行一次：0 0 23 * * ?
//    每天凌晨1点执行一次：0 0 1 * * ?
//    每月1号凌晨1点执行一次：0 0 1 1 * ?
//    每月最后一天23点执行一次：0 0 23 L * ?
//    每周星期天凌晨1点实行一次：0 0 1 ? * L
//    在26分、29分、33分执行一次：0 26,29,33 * * * ?
//    每天的0点、13点、18点、21点都执行一次：0 0 0,13,18,21 * * ?
    @Scheduled(cron = "${cron.demo-queue}")
    @Async
    public void confirmRabbit(){
        //查询状态为失败的，修改状态
        List<RabbitConfirmMsg> list = rabbitConfirmMsgService.list(
                new LambdaQueryWrapper<RabbitConfirmMsg>()
                        .eq(RabbitConfirmMsg::getStatus, RabbitmqEnum.ConfirmStatus.FAILURE.getStatus()).last("limit 50"));
        log.info("list.size={}",list.size());
        //
        if(list.size()==0){
            log.info("no failure msg");
            return;
        }
        try {
            Thread.sleep(2000);
            List<String> ids = list.stream().map(RabbitConfirmMsg::getCorrelationDataId).collect(Collectors.toList());
            log.info("update list ids={}",ids);
            boolean update = rabbitConfirmMsgService.update(
                    new LambdaUpdateWrapper<RabbitConfirmMsg>()
                            .set(RabbitConfirmMsg::getStatus, RabbitmqEnum.ConfirmStatus.SUCCESS.getStatus())
                            .set(RabbitConfirmMsg::getUpdateTime, LocalDateTime.now())
                            .in(RabbitConfirmMsg::getCorrelationDataId, ids));
            log.info("confirmRabbit update Success  {}",update);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}
